์ž‘์„ฑ: 2026-03-04 02:23:35์ˆ˜์ •: 2026-03-04 02:23:35

Java Swing ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ: ํšจ์œจ์ ์ธ ํ™”๋ฉด ๋ฐฐ์น˜ ๋ฐฉ๋ฒ•

์ž๋ฐ” ์Šค์œ™(Java Swing)์œผ๋กœ GUI๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์Šค์œ™์€ ์ ˆ๋Œ€ ์ขŒํ‘œ ๋Œ€์‹  **๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ €(Layout Manager)**๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™”๋ฉด ํฌ๊ธฐ ๋ณ€ํ™”์—๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.


1. ์ฃผ์š” ๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ €

์Šค์œ™์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ด๋ฉด์„œ ์‹ค๋ฌด์— ์ž์ฃผ ์“ฐ์ด๋Š” 3๊ฐ€์ง€ ๋ ˆ์ด์•„์›ƒ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โ‘  BorderLayout (๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ)

JFrame์˜ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ, ํ™”๋ฉด์„ 5๊ฐœ ๊ตฌ์—ญ(๋ถ, ๋‚จ, ๋™, ์„œ, ์ค‘์•™)์œผ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค.

  • North, South: ๊ฐ€๋กœ๋กœ ๊ธธ๊ฒŒ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
  • East, West: ์„ธ๋กœ๋กœ ๊ธธ๊ฒŒ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
  • Center: ๋‚˜๋จธ์ง€ ์ „์ฒด ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฉฐ, ์ฐฝ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•  ๋•Œ ํ•จ๊ป˜ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.
JPanel panel = new JPanel(new BorderLayout());
panel.add(new JButton("๋ฉ”๋‰ด"), BorderLayout.NORTH);
panel.add(new JButton("๋กœ๊ทธ"), BorderLayout.SOUTH);
panel.add(new JTextArea(), BorderLayout.CENTER);

โ‘ก FlowLayout

์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•œ ์ค„๋กœ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ค„์ด ๊ฝ‰ ์ฐจ๋ฉด ์ž๋™์œผ๋กœ ๋‹ค์Œ ์ค„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. ๋ฒ„ํŠผ๋“ค์„ ๋‚˜๋ž€ํžˆ ๋ฐฐ์น˜ํ•  ๋•Œ ์ฃผ๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค.

JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); // ์šฐ์ธก ์ •๋ ฌ
buttonPanel.add(new JButton("ํ™•์ธ"));
buttonPanel.add(new JButton("์ทจ์†Œ"));

โ‘ข GridLayout

ํ™”๋ฉด์„ ์ผ์ •ํ•œ ํฌ๊ธฐ์˜ ๊ฒฉ์ž(๋ฐ”๋‘‘ํŒ) ํ˜•ํƒœ๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์˜ ํฌ๊ธฐ๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ณ„์‚ฐ๊ธฐ ๊ฐ™์€ UI๋ฅผ ๋งŒ๋“ค ๋•Œ ์ตœ์ ์ž…๋‹ˆ๋‹ค.

JPanel gridPanel = new JPanel(new GridLayout(3, 2)); // 3ํ–‰ 2์—ด
gridPanel.add(new JButton("1"));
gridPanel.add(new JButton("2"));
// ... ๊ณ„์† ์ถ”๊ฐ€

2. ๋ณตํ•ฉ ๋ ˆ์ด์•„์›ƒ ์ „๋žต (Nested Panels)

ํ•˜๋‚˜์˜ ๋ ˆ์ด์•„์›ƒ๋งŒ์œผ๋กœ๋Š” ๋ณต์žกํ•œ ํ™”๋ฉด์„ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ธฐ๋ฒ•์€ JPanel์„ ์ค‘์ฒฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • Step 1: ๋ฉ”์ธ ํ”„๋ ˆ์ž„์—๋Š” BorderLayout์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Step 2: ๋‚จ์ชฝ(SOUTH) ๊ตฌ์—ญ์— FlowLayout์„ ๊ฐ€์ง„ JPanel์„ ๋„ฃ์–ด ๋ฒ„ํŠผ๋“ค์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • Step 3: ์ค‘์•™(CENTER) ๊ตฌ์—ญ์— GridLayout์„ ๊ฐ€์ง„ JPanel์„ ๋„ฃ์–ด ์ž…๋ ฅ ํผ์„ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

3. ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ์‹ค๋ฌด ํŒ

  1. Pack() ๋ฉ”์„œ๋“œ: frame.setSize() ๋Œ€์‹  frame.pack()์„ ํ˜ธ์ถœํ•˜๋ฉด, ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ๊ถŒ์žฅ ํฌ๊ธฐ(Preferred Size)์— ๋งž์ถฐ ์ฐฝ ํฌ๊ธฐ๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ ˆ๋ฉ๋‹ˆ๋‹ค.
  2. Margin๊ณผ Padding: ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์— ์—ฌ๋ฐฑ์„ ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด EmptyBorder๋ฅผ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜, ๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ € ์ƒ์„ฑ ์‹œ ๊ฐ„๊ฒฉ(hgap, vgap)์„ ์„ค์ •ํ•˜์„ธ์š”.
  3. ์ปดํฌ๋„ŒํŠธ ํฌ๊ธฐ ๊ณ ์ •: ๋ ˆ์ด์•„์›ƒ ๋งค๋‹ˆ์ €๊ฐ€ ์ปดํฌ๋„ŒํŠธ ํฌ๊ธฐ๋ฅผ ๊ฐ•์ œ๋กœ ์กฐ์ ˆํ•˜๋ฏ€๋กœ, setPreferredSize()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํžŒํŠธ๋ฅผ ์ฃผ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

4. ์š”์•ฝ

  • ํ™”๋ฉด์˜ ํฐ ํ‹€์€ **BorderLayout**์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค.
  • ์„ธ๋ฐ€ํ•œ ๋ฐฐ์น˜๋Š” JPanel์„ ์ค‘์ฒฉํ•˜์—ฌ ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ ˆ๋Œ€ ์ขŒํ‘œ(setLayout(null))๋Š” ์ฐฝ ํฌ๊ธฐ ์กฐ์ ˆ ์‹œ UI๊ฐ€ ๊นจ์ง€๋ฏ€๋กœ ๊ฐ€๊ธ‰์  ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ ์ ˆํ•œ ๋ ˆ์ด์•„์›ƒ ์„ ํƒ์€ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์šด ๊น”๋”ํ•œ UI์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค.